剑指offer面试题3:在二维数组存储方式、初始化,二位数组应用:二位数组的查找

1.二位数组存储方式:

第一,数组元素在内存中是顺序、连续存储的。
第二,matrix是一个二维数组,二维数组在内存中是按行存放的,即先放第1行,再放第2行……每行中的元素是按列下标由小到大的次序存放,这样的存储方式也称为行优先存储。
第三,这里定义的数组 int *matrix是一个指针数组,指针数组的每个元素都是指针变量。举个例子,如果一个4行4列的二维指针数组,那么他的第2行第3列(row=1,column=2),也就是存储的位置就是row*4+column,即1*4+2=6,存储在第六个位置(位置下标从0开始),那么获得该元素的表示即为matrix[1*4+2].

2.二位数组的初始化

默认初始化:int a[10][10]={0};

全部初始化:

int matrix[4][4]={
    {1,2,8,9},
    {2,4,9,12},
    {4,7,10,13},
    {6,8,10,15}
    };

3.二位数组应用:二位数组的查找

有一个二位数组从左到右,从上到下依次增大,如何查找某数字是否存在于数组中?

思路:从右上角或左下角开始寻找

ps:为什么不能从左上角或右下角开始寻找?

因为在左上角比如第一个数的位置,如果寻找的数7比第一行第一列的数1要大,那么它下一个比较的是第一行第二列的数还是第二行第一列的数呢?那就会有重叠。而从右上角或左下角开始寻找就是为了当发现7小于最后一列第一行的数9时,就排除了第四列,依次查询第3列,第2列的第一行。

解答思路及代码 

//思路从右上角开始,逐步排除右边的列,锁定列数后,逐步排除行 
bool Find(int *matrix,int rows,int columns,int numbers)
{
	bool found = false;
	if( matrix != NULL && rows>0 && columns>0)
	{
		int col = columns -1;
		int row = 0;
		while( col>=0 && row<= (rows-1))
		{
			if(matrix[row * 4 + col]>numbers)//在第row行寻找可能所在的列数 
			{
				col --;
			}else{//在第col列寻找可能所在的行数 
				if(matrix[row * 4 + col] == numbers)//numbers等于第一行第col列时 
				{
					found = true;
					break;
				}else{// numbers大于第一行第col列时 ,找这一列的其他行 
					row++;
				}
			}
		}
			
	}
	return found;
}

 

4.测试

主函数:

int main()
{
	int matrix[4][4]={
	{1,2,8,9},
	{2,4,9,12},
	{4,7,10,13},
	{6,8,11,15}
	};
	if(Find(*matrix,4,4,20)==true)
	{
		cout<<"Exist"<<endl;
		return 0;
	 } else{
	 	cout<<"Don't exist"<<endl;
	 	return 0;
	 }
	
}

测试用例设计:

 最小中间最大
查询存在的测试用例1715
测试结果:ExistExistExist
查询不存在的测试用例0520
测试结果Don't existDon't existDon't exist

 

二位数组的存储二位数组matrix[row * columns + column]引用:https://zhidao.baidu.com/question/489919999594033652.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值